package reflect;

import java.lang.reflect.Method;
import java.util.Scanner;

/**
 * @author Administrator
 * @Description
 * JAVA 反射机制
 * 反射是java的动态机制, 允许我们在程序(运行期间)再确定对象的实例化,属性的操作,方法的调用等
 * 反射机制可以提高代码的灵活度,但是同时带来了更多的开销和较慢的运行效率,因此不能过度依赖
 * @date 2022/5/23 9:12
 **/
public class ReflectDemo1 {
    public static void main(String[] args) throws ClassNotFoundException {
        //反射机制第一步:在程序运行期间获取要操作的类的类对象
        //类对象:Class类的实例
        //JVM加载一个类时,就会实例化一个Class的实例与其绑定,并且这个Class实例中会记录加载类的一切信息
        //类名,包名,方法,构造器
        //获取一个类的类对象的方式
        /**
         * 1 :类名.class
         * 比如:
         * Class cls = String.class
         * Class cls = int.class
         * 注意:基本类型获取相应的类对象只有这一种方式
         * 2 : Class.forName(String ClassName)
         * 比如:
         * Class cls = Class.forName("java.lang.string")
         * 注意:参数要求传入的必须是包名加类名
         * 3:ClassLoader方式加载
         */
//        Class cls = Class.forName("reflect.Person");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入一个类名");
        Class<?> cls = Class.forName(scanner.nextLine());
        String name = cls.getName();
        System.out.println(name);
        name = cls.getSimpleName();
        System.out.println(name);

        String packageName = cls.getPackage().getName();
        System.out.println(packageName);
        //Method称为方法对象,该对象的每一个实例用于表示一个方法,该对象记录着其表示的方法里的所有信息
        //如:方法的修饰符,返回值类型,方法名,参数列表信息等.
        Method[] methods = cls.getMethods();
        for (Method method : methods) {
            System.out.println(method.getName());//方法名

        }
    }
}
